import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useUserStore } from '@/stores/user'
import router from '@/router'

// 创建axios实例
const service: AxiosInstance = axios.create({
  baseURL: '/cms', // api的base_url
  timeout: 60000, // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    const userStore = useUserStore()

    // 详细的请求日志
    console.log('=== 发送请求 ===')
    console.log('请求方法:', config.method?.toUpperCase())
    console.log('请求URL:', config.baseURL + config.url)
    console.log('请求头:', config.headers)
    console.log('请求数据:', config.data)
    console.log('================')

    // 如果有token，在请求头中携带token
    if (userStore.token) {
      config.headers = config.headers || {}
      config.headers['Authorization'] = `Bearer ${userStore.token}`
    }

    // 确保Content-Type正确设置
    if (config.method === 'post' || config.method === 'put') {
      config.headers = config.headers || {}
      if (!config.headers['Content-Type']) {
        config.headers['Content-Type'] = 'application/json'
      }
    }

    return config
  },
  (error) => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    const res = response.data

    // 详细的响应日志
    console.log('=== 收到响应 ===')
    console.log('响应状态:', response.status)
    console.log('响应URL:', response.config.url)
    console.log('响应数据:', res)
    console.log('================')

    // 如果返回的状态码为0，说明接口请求成功，可以正常拿到数据
    if (res.code === 0) {
      return res
    }

    // 如果返回的状态码不是0，说明接口请求失败
    ElMessage.error(res.msg || '请求失败')

    // 如果是401，说明token过期，需要重新登录
    if (res.code === 401) {
      ElMessageBox.confirm('登录状态已过期，请重新登录', '系统提示', {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning',
      }).then(() => {
        const userStore = useUserStore()
        userStore.logout()
        router.push('/login')
      })
    }

    return Promise.reject(new Error(res.msg || '请求失败'))
  },
  (error) => {
    console.error('响应错误:', error)
    
    if (error.response) {
      const { status, data } = error.response
      
      if (status === 401) {
        ElMessageBox.confirm('登录状态已过期，请重新登录', '系统提示', {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning',
        }).then(() => {
          const userStore = useUserStore()
          userStore.logout()
          router.push('/login')
        })
      } else if (status === 403) {
        ElMessage.error('没有权限访问该资源')
      } else if (status === 404) {
        ElMessage.error('请求的资源不存在')
      } else if (status >= 500) {
        ElMessage.error('服务器内部错误')
      } else {
        ElMessage.error(data?.message || '请求失败')
      }
    } else if (error.code === 'ECONNABORTED') {
      ElMessage.error('请求超时')
    } else {
      ElMessage.error('网络错误')
    }

    return Promise.reject(error)
  }
)

// 导出request函数
export const request = service

export default service
